import { NodeSSH } from 'node-ssh';

const ssh = new NodeSSH();

// 执行SSH命令函数
async function executeCommand(ssh, command) {
  try {
    console.log(`执行命令: ${command}`);
    const result = await ssh.execCommand(command);
    
    // 输出stderr的内容用于调试，但不以此判断失败
    if (result.stderr) {
      console.log(`命令输出信息: ${result.stderr}`);
    }
    
    // 主要根据退出码来判断命令是否成功执行
    if (result.code === 0) {
      return true;
    } else {
      console.error(`命令执行失败，退出码: ${result.code}`);
      return false;
    }
  } catch (error) {
    console.error(`命令执行异常: ${error.message}`);
    return false;
  }
}

// 构建并部署Docker镜像
async function buildAndDeployDocker(ssh) {
  try {
    const remoteDir = '/opt/blog-ui';
    
    // 进入部署目录
    const cdCommand = `cd ${remoteDir}`;
    
    // 停止并删除旧容器
    console.log('停止并删除旧容器...');
    await executeCommand(ssh, `${cdCommand} && docker stop blog-ui || true && docker rm blog-ui || true`);
    
    // 删除旧镜像
    console.log('删除旧镜像...');
    await executeCommand(ssh, `${cdCommand} && docker rmi blog-ui-image || true`);
    
    // 构建新镜像
    console.log('构建新镜像...');
    const buildSuccess = await executeCommand(ssh, `${cdCommand} && docker build --no-cache -t blog-ui-image .`);
    if (!buildSuccess) {
      console.error('构建镜像失败');
      return false;
    }
    
    // 运行新容器
    console.log('运行新容器...');
    const runSuccess = await executeCommand(ssh, `${cdCommand} && docker run -d --name blog-ui -p 80:80 blog-ui-image`);
    if (!runSuccess) {
      console.error('启动容器失败');
      return false;
    }
    
    // 清理虚悬镜像
    console.log('清理虚悬镜像...');
    await executeCommand(ssh, 'docker image prune -f');
    
    return true;
  } catch (error) {
    console.error('Docker部署过程中发生错误:', error.message);
    return false;
  }
}

// 上传和部署一体化函数
async function deploy() {
  try {
    console.log('开始连接服务器...');

    // 连接到云服务器
    await ssh.connect({
      host: '117.72.189.56',
      port: 22,
      username: 'root',
      password: 'Zhuliang0618@' // 密码验证
    });

    console.log('连接成功，开始上传...');

    // 上传Dockerfile
    console.log('上传Dockerfile...');
    await ssh.putFile('./Dockerfile', '/opt/blog-ui/Dockerfile');
    
    // 上传default.conf
    console.log('上传default.conf...');
    await ssh.putFile('./default.conf', '/opt/blog-ui/default.conf');

    // 上传dist目录
    const localPath = './dist';
    const remotePath = '/opt/blog-ui/dist';

    console.log('上传dist目录...');
    const uploadSuccess = await ssh.putDirectory(localPath, remotePath, {
      recursive: true,
      concurrency: 5,
      validate: () => true, // 默认全部文件上传
    });

    if (uploadSuccess) {
      console.log('上传成功');
      
      // 执行Docker部署
      console.log('开始部署...');
      const deploySuccess = await buildAndDeployDocker(ssh);
      if (deploySuccess) {
        console.log('部署完成!');
      } else {
        console.error('部署失败!');
      }
    } else {
      console.error('上传失败');
    }

  } catch (e) {
    console.error('部署过程中发生错误:', e);
  } finally {
    // 关闭SSH连接
    if (ssh.isConnected()) {
      ssh.dispose();
      console.log('SSH连接已关闭');
    }
  }
}

// 执行部署
deploy();
